package com.probiz.estore.product.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import net.sf.json.JSONObject;

import com.probiz.estore.common.model.catalog.ProductCategory;
import com.probiz.estore.common.model.customer.Customer;
import com.probiz.estore.common.model.product.Product;
import com.probiz.estore.common.model.product.ProductAttGroup;
import com.probiz.estore.common.model.product.ProductSku;
import com.probiz.estore.common.model.product.SkuOption;
import com.probiz.estore.common.model.product.SkuOptionValue;
import com.probiz.estore.product.model.ProductFilterGroup;
import com.probiz.estore.product.model.ProductFullyModel;
import com.probiz.estore.product.model.ProductSearchCriteria;
import com.probiz.estore.product.model.ProductUniBulkEditModel;

/**
 *产品模块主要/首要/统领manager 
 *
 */
public interface ProdMainManager {
	public static Short DELETE_STATUS_PHYSICAL = 1;//物理删除成功
	public static Short DELETE_STATUS_LOGICAL = 2;//逻辑删除成功，即归档成功
	public static Short DELETE_STATUS_FALSE = 0;//删除不成功
	
	
	/**
	 * 完全保存方法
	 * @param model 产品保存model
	 * @return 返回信息
	 */
	public Map<String, Object> saveFully(ProductFullyModel model) throws Exception;
	/**
	 * 商品导入保存，只用于导入
	 * @param product
	 * @return
	 */
	public Product saveFullyForImport(Product product);
	
	/**
	 * 完全删除方法
	 * @param product 产品
	 * @return DELETE_STATUS_PHYSICAL,DELETE_STATUS_LOGICAL,DELETE_STATUS_FALSE其中一个
	 */
	public short deleteFully(Product product);
	

	public void doShelve(Product product) ;
	public void doShelve(Integer productId);
	public void doShelve(Integer[] productIdList) ;
	


	public void doOffShelve(Product product) ;
	public void doOffShelve(Integer productId);
	public void doOffShelve(Integer[] productIdList) ;
	
	
	/**
	 * 统一批修改
	 * @param model 统一批修改model
	 * @return
	 */
	public Map<String, Object> doUniBulkEdit(ProductUniBulkEditModel model);
	
	/**
	 * 分别调价
	 * @param request
	 * @return
	 */
	public Map<String, Object> doAssBulkEdit(ProductFullyModel model);

	
	/**
	 * 增加一个浏览数量
	 * @param productId
	 */
	public void doIncreaseOneViewCount(Integer productId); 
	/**
	 * 增加一个购买次数
	 * @param productId
	 */
	public void doIncreaseOneBuyTimes(Integer productId); 
	/**
	 * 改变累积购买数量
	 * @param productId
	 * @param buyCount (可为正或负数)
	 * 
	 */
	public void doUpdateStatBuyCount(Integer productId,Integer buyCount); 
	/**
	 * 增加一个好评
	 * @param productId
	 */
	public void doIncreaseOnePositiveRate(Integer productId);
	/**
	 * 增加一个中评
	 * @param productId
	 */
	public void doIncreaseOneNeutralRate(Integer productId); 
	/**
	 * 增加一个差评
	 * @param productId
	 */
	public void doIncreaseOneNegativeRate(Integer productId); 
	/**
	 * 减少一个浏览数量
	 * @param productId
	 */
	public void doDecreaseOneViewCount(Integer productId);
	/**
	 * 减少一个购买次数
	 * @param productId
	 */
	public void doDecreaseOneBuyTimes(Integer productId); 
	/**
	 * 减少一个好评
	 * @param productId
	 */
	public void doDecreaseOnePositiveRate(Integer productId);
	/**
	 * 减少一个中评
	 * @param productId
	 */
	public void doDecreaseOneNeutralRate(Integer productId); 
	/**
	 * 减少一个差评
	 * @param productId
	 */
	public void doDecreaseOneNegativeRate(Integer productId); 
	
	
	
	/**
	 * 获得产品的属性组及其属性值
	 * @param product
	 * @return
	 */
	public List<ProductAttGroup> getProductAttGroupsAndValues(Product product);
	
	/**
	 * 检查SKU是否被订单所使用
	 * @param productSkuId
	 * @return
	 */
	public boolean checkSkuIsInUse(Integer productSkuId);
	
	
	
	/**
	 * 快速搜索相关
	 * 产生界面的快速搜索项
	 * @param productCategory 商品目录
	 * @param URI 当前页面URI
	 * @param URI 当前页面的搜索参数
	 * @return 快速搜索项组
	 */
	public List<ProductFilterGroup> generateProductFilters(ProductCategory productCategory, String URI,String queryString);
	
	/**
	 * 设置前台快速搜索条件
	 * 快速搜索相关
	 * @parm productSearchCriteria 产品搜索条件
	 * @param productCategory 商品目录
	 * @param URI
	 * @return 自定义搜索条件
	 */
	public ProductSearchCriteria setProductQuickSearchCriteria(ProductSearchCriteria productSearchCriteria,ProductCategory productCategory, String URI); 
	/**
	 * 获得与商品相关的规格与候选规格值的map
	 * @param product
	 * @return map
	 */
	public Map<SkuOption, Set<SkuOptionValue>> findMapOfRelatedSkuOptionAndValues(Product	product);
	/**
	 * 获得与单品相关的规格及其对应的规格值的map
	 * @param productSku
	 * @return
	 */
	public Map<SkuOption ,SkuOptionValue> findMapOfRelatedSkuOptionAndValue (ProductSku  productSku);
	/**
	 * 为前台构造一个商品json对象
	 * @param product
	 * @return 商品json对象
	 */
	public JSONObject getProductJSONDataForFront(Product product);
	/**
	 * 从request中获得比较车中的商品
	 * @param request
	 * @return
	 */
	public List<Product> getCompareProductsFromRequest(HttpServletRequest request);
	
   

}
